Link: https://github.com/wapsyed/cursor

Ministrante: Wasim Aluísio Prates Syed, Farmacêutico pela FCFRP-USP, doutorando em biotecnologia pelo ICB/IPT/Butantan, e divulgador científico pela UPVacina (IEARP-USP) e Projeto Halo (ONU).

Descrição do curso:

Desenvolvemos um curso para tornar o aprendizado de uma das linguagens de programação e análise de dados mais populares mais acessível, especialmente para aqueles que não têm formação em áreas de exatas, como TI e ciência da computação. Esta linguagem é amplamente utilizada por cientistas devido à sua variedade de ferramentas para análise de dados em ciências biológicas e da saúde. Com uma abordagem prática e interativa, os participantes explorarão conceitos e ferramentas para realizar análises de dados de forma simples e intuitiva. Além disso, terão acesso a um grupo de discussão para compartilhar dúvidas e ideias, criando um ambiente colaborativo e de aprendizado mútuo.

Programação e conteúdo

Os participantes terão uma aula introdutória à ciência de dados e fundamentos da manipulação de dados no R e visualização de dados com o ggplot, no ambiente do RStudio. Em seguida, os participantes terão um tempo para praticar e desenvolver as análises com 5 países de escolha, e no final deverão criar um poster com os gráficos produzidos.

  • Introdução ao R: Explicaremos por que o R é importante para cientistas e profissionais da saúde.

  • Fundamentos da Programação em R: Abordaremos conceitos como funções, pacotes, variáveis e estruturas de dados, como data frames, listas e matrizes.

  • Manipulação e Visualização de Dados: Exploraremos técnicas para importar, limpar, filtrar e visualizar dados usando pacotes do Tidyverse, como dplyr e ggplot2.

  • Análise Exploratória de Dados: Realizaremos análises exploratórias de dados, incluindo estatísticas descritivas, gráficos e interpretação de resultados. Aplicaremos os conhecimentos adquiridos em um projeto prático com dados reais de saúde, incluindo análise de vacinação e indicadores de saúde pública.

Prática

OBS: Para apresentar de tabelas e imagens fora do Markdown, vá para o Tools > Global options > R Markdown and unselect “Show output inline for all R Markdown documents”

1. Biblioteca e pacotes

Antes de rodarmos os códigos para as análises, é necessário instalar os pacotes cujos recursos, especialmente as funções, serão utilizados. Para isso, use o install.packages("pacote").

Nem sempre é necessário reinstalar os pacotes, pois isso toma tempo. Entretanto, é recomendável reinstalar os pacotes de vez em quando, para atualizar o pacote.

Observe que o código abaixo está com # antes da função. Ao rodar pela primeira vez, retire estes # e execute.

options(repos = c(CRAN = "https://cran.r-project.org"))

# Baixar pacotes do CRAN para a biblioteca 
# install.packages("tidyverse")
# install.packages("skimr")
# install.packages("janitor")
# install.packages("esquisse")
# install.packages("ggthemes")
# install.packages("plotly")
# install.packages("gghighlight")
# install.packages("patchwork")
# install.packages("ggsci")
# install.packages("gapminder")

Após a instalação, a cada vez que você fechar o ambiente do R, você deverá chamar os pacotes da biblioteca com a função library().

# Chamando os pacotes da biblioteca
library(tidyverse) #Metapacote 
library(skimr) #Diagnóstico de tabela
library(janitor) #Limpeza de tabelas
library(esquisse) #Plotagem de gráficos prática
library(ggthemes) #Temas de ggplot
library(plotly) #Gráficos interativos
library(patchwork) #Unir gráficos
library(gghighlight) #Marcar pontos e linhas 
library(ggsci) #Paleta de cores 
library(gapminder)

2. Operações básicas

Podemos criar variáveis de diferentes classes, como numéricas (integer, double), textuais (string/character), e muitas outras. Além disso, essas variáveis podem ser nomeadas com o nome que você quiser, como letras e palavras.

Entretanto, não podem ter espaço entre si (variavel_a != variavel a) e, por mais que funcionem com palavras em portugues acentuadas (“multiplicacão”), é uma boa prática nomeá-las da forma mais simples possível.

#Operações básicas -----

#Variáveis numéricas
x = 5
x
## [1] 5
y = 7
y
## [1] 7
z = y + x
z
## [1] 12
multiplicacão = x * y
multiplicacão
## [1] 35

As variáveis textuais são sempre definidas com aspas, mesmo sendo um número, como string = "5".

# Variáveis textuais (characters, string)
a = "Olá" #Uma palavra
a
## [1] "Olá"
b = "Tudo bem?" #Uma frase
b
## [1] "Tudo bem?"

Operações lógicas

Se usarmos operadores lógicos para determinar se o conteúdo de uma variável é igual (==), diferente (!=), maior (>) ou menor (<), os resultados retornarão TRUE ou FALSE.

# Comparações lógicas (booleanas)
a == b #Igual?
## [1] FALSE
a != b #Diferente?
## [1] TRUE
x < y # Menor?
## [1] TRUE
x > y # Maior?
## [1] FALSE
x <= 5 # Menor ou igual?
## [1] TRUE

E, se criarmos outras variáveis com nomes diferentes, mas com os mesmos valores, elas ainda continuarão dando o mesmo resultado.

aa = "Olá"
aa == a 
## [1] TRUE

Vetores

Os vetores são uma sequência unidimensional que podem ser números, strings, valores lógicos, entre outros. Podemos criar vetores com a função c(), de “concatenar”.

# Vetores
i = c(7, 5, 9, 10)
i
## [1]  7  5  9 10
j = c("Olá", "Caneta", "Qualificacao")
j
## [1] "Olá"          "Caneta"       "Qualificacao"

Perceba que, para um vetor ser classificado como numérico, todos os elementos têm de ser números, isto é, não estar dentro de aspas. Do contrário, se um elemento for uma string (contiver aspas), mesmo com um número dentro, do vetor inteiro será convertido em strings.

h = c(7, "10", 78)
h
## [1] "7"  "10" "78"

Obtendo ajuda com funções

O c() é um exemplo de função. Toda função contem um nome seguido por parenteses. No caso da função c(), inserimos os elementos que temos interesse.

No entanto, outras funções que iremos aprender a seguir funcionam de forma diferente, muitas vezes intuitiva. Para acessar a documentação da função, use um ? antes da função e aguarde a aba de ajuda abrir.

# O que esta função faz? Use o "?" antes da função e rode.
?c()

Dataframes e tibbles

Dataframes e tibbles são tabelas comuns e consistem de linhas e colunas de diferentes classes, como números, caracteres e fatores.

As tibbles são diferentes dos dataframes somente em sua apresentação no console e facilitam muito o trabalho com tabelas grandes e largas.

Além disso, a criação do dataframe e da tibble são diferentes visualmente. Enquanto no dataframe usamos a função data.frame() para criar colunas com linhas definidas por um vetor, na tibble esse código é semelhante à forma que imputamos dados no excel.

#Dataframes e tibbles -----

#Dataframe
data = data.frame(
  nome = c("Gabriela", "Júlia", "Beatriz", "Luiza"),
  altura = c(1.59, 1.60, 1.78, 1.73),
  idade = c(30, 25, 31, 32)
)
data
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32

E para criar uma tibble, usamos a função tribble().

#Tibble
tibble = tribble(
  ~nome, ~altura, ~idade,
  "Gabriela", 1.59,   30,
  "Júlia",   1.60,   25,
  "Beatriz", 1.65,  31,
  "Luiza",   1.73,   32 
  )

tibble
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32

É possível transformar quase todo objeto em uma tabela.

Por exemplo, se pegarmos os vetores criados anteriormente e usarmos a função as.data.frame(), será criada uma coluna com o nome do vetor, seguida por linhas contendo os elementos do vetor.

# Vetores em dataframe
as.data.frame(i) #dataframe com coluna numérica
##    i
## 1  7
## 2  5
## 3  9
## 4 10
as.data.frame(j) #dataframe com coluna textual
##              j
## 1          Olá
## 2       Caneta
## 3 Qualificacao
as.data.frame(h) #dataframe com coluna textual, mesmo com valores numéricos
##    h
## 1  7
## 2 10
## 3 78

Há diferentes formas de se visualizar uma tabela.

A diferença de cada objeto está na visualização no console e no documento. Teste estas linhas de código no documento Markdown e no console.

#Visualizando o dataframe -----
# Com print()
print(data) #No documento ou console
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
print(tibble)
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32
# Com nome do objeto
data
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
tibble 
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32
# Com glimpse(). #Descrição mais completa da tabela
glimpse(data) 
## Rows: 4
## Columns: 3
## $ nome   <chr> "Gabriela", "Júlia", "Beatriz", "Luiza"
## $ altura <dbl> 1.59, 1.60, 1.78, 1.73
## $ idade  <dbl> 30, 25, 31, 32
glimpse(tibble)
## Rows: 4
## Columns: 3
## $ nome   <chr> "Gabriela", "Júlia", "Beatriz", "Luiza"
## $ altura <dbl> 1.59, 1.60, 1.65, 1.73
## $ idade  <dbl> 30, 25, 31, 32
# Com view() ou View(). A tabela completa com mais funcionalidades (filtragem manual, pesquisa e ordenamento) abrirá em uma nova janela
view(data) 
view(tibble)

# Selecione o nome do objeto, segure Ctrl e clique com o botão direito do mouse.
data
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
tibble 
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32

Estatísticas gerais da tabela

O R possui uma função muito prática de análise estatística descritiva, a summary().

No entanto, existem outros pacotes que realizam essas análises e até geram relatórios em HTML.

Um deles é o skimr, cuja função skim() gera três outputs, um semelhante ao summary, e outras duas tabelas com a quantidade de valores não disponíveis (NA), estatísticas descritivas, e um histograma.

# Estatísticas gerais 
summary(tibble)
##      nome               altura          idade      
##  Length:4           Min.   :1.590   Min.   :25.00  
##  Class :character   1st Qu.:1.597   1st Qu.:28.75  
##  Mode  :character   Median :1.625   Median :30.50  
##                     Mean   :1.643   Mean   :29.50  
##                     3rd Qu.:1.670   3rd Qu.:31.25  
##                     Max.   :1.730   Max.   :32.00
summary(data)
##      nome               altura          idade      
##  Length:4           Min.   :1.590   Min.   :25.00  
##  Class :character   1st Qu.:1.597   1st Qu.:28.75  
##  Mode  :character   Median :1.665   Median :30.50  
##                     Mean   :1.675   Mean   :29.50  
##                     3rd Qu.:1.742   3rd Qu.:31.25  
##                     Max.   :1.780   Max.   :32.00
# Usando skim
skim(tibble)
Data summary
Name tibble
Number of rows 4
Number of columns 3
_______________________
Column type frequency:
character 1
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
nome 0 1 5 8 0 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
altura 0 1 1.64 0.06 1.59 1.60 1.62 1.67 1.73 ▇▁▃▁▃
idade 0 1 29.50 3.11 25.00 28.75 30.50 31.25 32.00 ▃▁▁▃▇
skim(data)
Data summary
Name data
Number of rows 4
Number of columns 3
_______________________
Column type frequency:
character 1
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
nome 0 1 5 8 0 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
altura 0 1 1.68 0.09 1.59 1.60 1.67 1.74 1.78 ▇▁▁▃▃
idade 0 1 29.50 3.11 25.00 28.75 30.50 31.25 32.00 ▃▁▁▃▇

Pivotando tabelas: Long e Wide

As tabelas tidy possuem dois formatos, um largo (wide) e outro longo (long). Converter uma em outra é conhecido como pivotagem, e conhecer essas funções é importantíssimo para obter, manipular e explorar dados.

Para pivotar, utilizamos pivot_longer() e pivot_wider(). A pivotagem deve ser pensada com base na relação entre variáveis e seus valores.

Por exemplo, se tivermos uma tabela larga com 10 colunas com anos (de 1990 a 2000), podemos reduzi-las em uma só coluna chamada “anos”, que facilitará a manipulação de dados. Isso alongará a tabela.

# Trabalhando com dataframes -----
#Transformando outros formatos em dataframe

# Long table
data_long = pivot_longer(data, #Tabela 
             cols = c(altura, idade), #Colunas para alongar 
             values_to = "valor", # Estocar valores em uma nova coluna
             names_to = "variavel" # Estocar variáveis em uma nova coluna
             ) 
data
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
data_long
## # A tibble: 8 × 3
##   nome     variavel valor
##   <chr>    <chr>    <dbl>
## 1 Gabriela altura    1.59
## 2 Gabriela idade    30   
## 3 Júlia    altura    1.6 
## 4 Júlia    idade    25   
## 5 Beatriz  altura    1.78
## 6 Beatriz  idade    31   
## 7 Luiza    altura    1.73
## 8 Luiza    idade    32

Mas, se quisermos deixá-la mais fácil de ser interpretada por humanos, podemos pivotá-la em uma tabela larga.

# Wide table
data_wide = pivot_wider(data_long, #Tabela
            names_from = variavel, #Dividir níveis de uma coluna em novas colunas
            values_from = valor)   #Estocar valores relacionados à coluna nome e novas variáveis) 
data_wide
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.78    31
## 4 Luiza      1.73    32

Matrizes

É importante saber manipular matrizes para computar análises estatísticas, como a Principal Components Analysis.

As matrizes são estruturas tabelares cujos valores são somente numéricos. Ou seja, não podemos ter uma coluna com strings, por exemplo.

Para isso, é necessário converter a coluna de “nomes” (strings) em nomes de linhas (rownames) usando a função column_to_rownames(), e então converter a tabela em matriz, com o as.matrix().

A diferença aqui é a apresentação da tabela. Enquanto dataframes e tibbles são facilmente lidas, as matrizes são mais complicadas nesse sentido.

#Matriz
matrix = as.matrix(data) #Transformar tabela em matriz
matrix #Os valores numéricos são strings
##      nome       altura idade
## [1,] "Gabriela" "1.59" "30" 
## [2,] "Júlia"    "1.60" "25" 
## [3,] "Beatriz"  "1.78" "31" 
## [4,] "Luiza"    "1.73" "32"
data_matrix = column_to_rownames(data, "nome") #Converte coluna em rownames
matrix = as.matrix(data_matrix)
matrix #Agora, os valores são numéricos
##          altura idade
## Gabriela   1.59    30
## Júlia      1.60    25
## Beatriz    1.78    31
## Luiza      1.73    32

Caso você queira manipular a matriz com as funções do tidyverse, é recomendável reconvertê-la em dataframe/tibble, manipular os dados, e depois converter novamente para matriz.

# Reconverter para dataframe
matrix_dr = as.data.frame(matrix)

matrix_dr # Coluna "nome" continua como rownames e dificulta a manipulação.
##          altura idade
## Gabriela   1.59    30
## Júlia      1.60    25
## Beatriz    1.78    31
## Luiza      1.73    32
matrix_dr = rownames_to_column(matrix_dr, "nome") #Converter rownames em nova coluna
matrix_dr
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32

Listas

Listas são estruturas que podem conter um conjunto de elementos de diferentes classes, como vetores, outras listas, dataframes, e matrizes.

Elas são interessantes para organizar os objetos necessários para uma análise, e são muito comuns em análises de RNAseq, por exemplo.

#Criando a lista
lista = list(a, b, h, j, multiplicacão, data, matrix, tibble)

#View(lista) #Visualizando a lista

#Acessando objetos diferentes da lista
lista[[1]] #Primeiro objeto
## [1] "Olá"
lista[[8]] #Oitavo objeto
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32
#Isolando o objeto
df_list = lista[[8]]
df_list
## # A tibble: 4 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32

Manipulação de tabelas com o R base

O R possui funções e formas nativas de acessar e manipular tabelas. Essas operações, como as descritas abaixo, não são mais a melhor forma de trabalhar, pois são pouco intuitivas. Mas, é importante conhecê-las, pois, são utilizadas em alguns casos.

# Acessando colunas do data frame
data$nome
## [1] "Gabriela" "Júlia"    "Beatriz"  "Luiza"
data$idade
## [1] 30 25 31 32
# Criando nova variável para não sobrescrever a tabela original para os próximos exemplos
data_2 = data

# Adicionando uma nova coluna ao data frame
data_2$peso = c(70, 
                65, 
                80, 
                20)
data_2
##       nome altura idade peso
## 1 Gabriela   1.59    30   70
## 2    Júlia   1.60    25   65
## 3  Beatriz   1.78    31   80
## 4    Luiza   1.73    32   20
# Removendo uma coluna do data frame
data_2 = data_2[ , -4]

# Filtrando linhas do data frame. df[linha, coluna]
data_jovens = data_2[data_2$idade < 30, ]
data_jovens
##    nome altura idade
## 2 Júlia    1.6    25
# Ordenando o data frame por uma coluna
data_ordenados <- data_2[order(data_2$idade), ]
data_ordenados
##       nome altura idade
## 2    Júlia   1.60    25
## 1 Gabriela   1.59    30
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32

3. Tidyverse

O tidyverse é um metapacote, um pacote com diversos pacotes dentro, que facilita muito o trabalho no R. As funções conversam entre si, são padronizadas e, mais importante, são muito intuitivas.

add_row() e add_column(): Adicionando linhas e colunas

Para adicionar uma linha com valores, usamos o add_row(), e para adicionar uma nova coluna com valores, usamos o add_column(). Bem intuitivo, né?

Para não alterarmos as tabelas originais, criamos uma nova variável chamada data_2 e tibble_2. Entretanto, não é necessário sempre criar uma variável para cada operação que fizermos.

#Adicionar linha
data_2 = add_row(data, 
               nome = "Rafaela", 
               idade = 50,
               altura = 1.85)

data_2
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
## 5  Rafaela   1.85    50
tibble_2 = add_row(tibble, 
                   nome = "Rafaela", 
                   idade = 50,
                   altura = 1.85)

tibble_2
## # A tibble: 5 × 3
##   nome     altura idade
##   <chr>     <dbl> <dbl>
## 1 Gabriela   1.59    30
## 2 Júlia      1.6     25
## 3 Beatriz    1.65    31
## 4 Luiza      1.73    32
## 5 Rafaela    1.85    50
#Adicionar coluna
data_2 = add_column(data_2,
                    peso = c(50,
                             80,
                             40,
                             100,
                             70))
data_2
##       nome altura idade peso
## 1 Gabriela   1.59    30   50
## 2    Júlia   1.60    25   80
## 3  Beatriz   1.78    31   40
## 4    Luiza   1.73    32  100
## 5  Rafaela   1.85    50   70
tibble_2 = add_column(tibble_2,
                      peso = c(50,
                               80,
                               40,
                               100,
                               70))
tibble_2
## # A tibble: 5 × 4
##   nome     altura idade  peso
##   <chr>     <dbl> <dbl> <dbl>
## 1 Gabriela   1.59    30    50
## 2 Júlia      1.6     25    80
## 3 Beatriz    1.65    31    40
## 4 Luiza      1.73    32   100
## 5 Rafaela    1.85    50    70

filter(): Filtrando linhas e usando o pipe

Sempre que estivermos manipulando linhas, utilizamos o verbo “filtrar”. No tidyverse, mais especificamente no pacote dplyr, usamos a função filter() e estabelecemos argumentos lógicos para a filtragem.

# Filtrando linhas ----
idade = filter(data, idade <= 30)

idade_nome = filter(idade,
                    nome == "Júlia")

idade_nome
##    nome altura idade
## 1 Júlia    1.6    25

Mas, e se eu quiser filtrar usando mais operações?

Temos duas formas de fazer isso.

A primeira é usando “OU” (|) e %in% c(). Veja que os resultados são iguais, mas a forma de escrever é diferente. No primeiro caso, temos de repetir “nome ==” a cada valor que quisermos incluir. No segundo caso, somente criamos um vetor com os valores separados por vírgula.

#Usando OU (|)
filter(data, nome == "Júlia" | 
           nome == "Gabriela")
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
#Usando %in% c()
filter(data, nome %in% c("Júlia", "Gabriela")) 
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25

E a segunda é usando o pipe (%>%), que permite “costurar” operações e resultados. Dessa forma, não precisamos criar uma variável/objeto sempre que uma função for aplicada. Usaremos muito o pipe nos próximos códigos.

Abaixo, pegamos uma tabela, filtramos por idade e, então, filtramos somente linhas que contêm um valor. No caso, pegamos as linhas com idade maior ou igual a 30 e, depois, aquelas que contêm o nome “Gabriela”.

# Usando o pipe "%>%" (lê-se "e então")
data %>%                   # Tenho este objeto 
  filter(idade >= 30) %>%  # E então vou filtrar os indivíduos com mais de 30 anos
  filter(nome == "Gabriela")   # E então vou filtrar os indivíduos chamados "Gabriela"
##       nome altura idade
## 1 Gabriela   1.59    30

select(): Selecionando colunas

Da mesma forma que trabalhamos com linhas usando filter(), ao trabalhar com colunas, usamos o select().

A função select é muito versátil, e além de selecionar colunas que você quer trabalhar, podemos reordená-las e renomeá-las manualmente.

Para isolar a(s) coluna(s), use select(coluna), que você produzirá uma tabela com somente aquela coluna.

Para retirar uma coluna, use o - ou o !.

Para reordenar, use select(coluna, everything()). Aqui, você coloca a coluna de interesse em primeiro lugar e todas as outras restantes em sequência.

# Selecionando colunas ----
# Selecionar colunas específicas
data_2 %>%
  select(nome, altura) 
##       nome altura
## 1 Gabriela   1.59
## 2    Júlia   1.60
## 3  Beatriz   1.78
## 4    Luiza   1.73
## 5  Rafaela   1.85
# Selecionar da coluna nome (1) à coluna peso (4)
data_2 %>% 
  select(nome:idade) 
##       nome altura idade
## 1 Gabriela   1.59    30
## 2    Júlia   1.60    25
## 3  Beatriz   1.78    31
## 4    Luiza   1.73    32
## 5  Rafaela   1.85    50
#Retirando coluna
data_2 %>% 
  select(-idade) 
##       nome altura peso
## 1 Gabriela   1.59   50
## 2    Júlia   1.60   80
## 3  Beatriz   1.78   40
## 4    Luiza   1.73  100
## 5  Rafaela   1.85   70
data_2 %>%   
  select(!idade)
##       nome altura peso
## 1 Gabriela   1.59   50
## 2    Júlia   1.60   80
## 3  Beatriz   1.78   40
## 4    Luiza   1.73  100
## 5  Rafaela   1.85   70
#Reordenando coluna
data_2 %>%   
  select(idade, everything())
##   idade     nome altura peso
## 1    30 Gabriela   1.59   50
## 2    25    Júlia   1.60   80
## 3    31  Beatriz   1.78   40
## 4    32    Luiza   1.73  100
## 5    50  Rafaela   1.85   70

Para renomear uma coluna, é possível também usar o select().Mas, cuidado, pois ao renomeá-las, se esquecermos do “everything()”, ficamos somente com a coluna renomeada.

Por isso, temos a função rename(), que evita que isso aconteça.

#Renomeando coluna
data_2 %>%   
  select(age = idade, everything())
##   age     nome altura peso
## 1  30 Gabriela   1.59   50
## 2  25    Júlia   1.60   80
## 3  31  Beatriz   1.78   40
## 4  32    Luiza   1.73  100
## 5  50  Rafaela   1.85   70
#Renomeando coluna com rename
data_2 %>%   
  rename(age = idade) #Retirando coluna
##       nome altura age peso
## 1 Gabriela   1.59  30   50
## 2    Júlia   1.60  25   80
## 3  Beatriz   1.78  31   40
## 4    Luiza   1.73  32  100
## 5  Rafaela   1.85  50   70

mutate(): Criando e realizando operações com novas variáveis

A função mutate() permite criar ou modificar colunas e imputar valores usando funções que se aplicarão a todas as linhas daquela coluna. Por exemplo, podemos criar a coluna imc com o IMC todos os indivíduos, que é calculado com a razão do peso e a altura ao quadrado.

# Criando novas variáveis
data_2 = data_2 %>%
  mutate(imc = peso / (altura^2)) #Para cada linha da tabela, pegaremos o valor do peso e dividiremos pela altura ao quadrado.

Além disso, podemos criar uma coluna com o sexo daquele indivíduo. Como sabemos que todos são “feminino”, podemos fazer dessa forma.

data_2 %>% 
  mutate(sexo = "feminino") #Como todas as linhas contêm nomes femininos, criaremos a coluna sexo com o valor "feminino"
##       nome altura idade peso      imc     sexo
## 1 Gabriela   1.59    30   50 19.77770 feminino
## 2    Júlia   1.60    25   80 31.25000 feminino
## 3  Beatriz   1.78    31   40 12.62467 feminino
## 4    Luiza   1.73    32  100 33.41241 feminino
## 5  Rafaela   1.85    50   70 20.45289 feminino

if_else e case_when(): Condições

Mas, podemos também usar um argumento lógico também.

Por exemplo, podemos criar uma coluna que classificará se a pessoa está acima ou abaixo de um IMC específico, a partir dos valores da coluna imc.

Isso é feito com a função if_else(), que é lida da seguinte forma: se isso for verdadeiro, dê o valor “A”, do contrário, “B”. No caso aqui, se a pessoa tiver um IMC acima de 25, ela será considerada com sobrepeso, e se for abaixo, será classificada como normal.

data_2 %>% 
  mutate(classificacao = if_else(imc > 25, "sobrepeso", "normal"))
##       nome altura idade peso      imc classificacao
## 1 Gabriela   1.59    30   50 19.77770        normal
## 2    Júlia   1.60    25   80 31.25000     sobrepeso
## 3  Beatriz   1.78    31   40 12.62467        normal
## 4    Luiza   1.73    32  100 33.41241     sobrepeso
## 5  Rafaela   1.85    50   70 20.45289        normal

Mas, sabemos que o IMC pode ser classificado com outras categorias. Para isso, temos duas formas de classificar. A primeira é usando o if_else() imputando os valores manualmente e deixando os valores que ainda não foram categorizados como NA, e depois, de criar a primeira categoria, criamos a segunda categoria e deixamos os que já estavam na coluna.

data_2 %>% 
  mutate(classificacao = if_else(imc >= 25 & imc <= 30 , "sobrepeso", NA),
         classificacao = if_else(imc > 30, "obesidade 1", classificacao),
         classificacao = if_else(imc >= 18.5 & imc <25, "normal",classificacao),
         classificacao = if_else(imc < 18.5, "magreza",classificacao))
##       nome altura idade peso      imc classificacao
## 1 Gabriela   1.59    30   50 19.77770        normal
## 2    Júlia   1.60    25   80 31.25000   obesidade 1
## 3  Beatriz   1.78    31   40 12.62467       magreza
## 4    Luiza   1.73    32  100 33.41241   obesidade 1
## 5  Rafaela   1.85    50   70 20.45289        normal

Veja que, depois da segunda linha de if_else, isso fica confuso de entender. Por isso, usamos o case_when(), que é um if_else mais versátil e deixa o código mais limpo e fácil de ler.

data_2 = data_2 %>% 
  mutate(classificacao = case_when(imc >= 25 & imc <= 30 ~ "sobrepeso",
                                   imc > 30 ~ "obesidade 1",
                                   imc >= 18.5 & imc < 25 ~ "normal",
                                   imc < 18.5 ~ "magreza"))

summarize(): resumindo estatísticas

A função summarize() (ou summarise()) aplica a mesma lógica, mas a tabela gerada é muito menor, e se aplica à variável de interesse na tabela. Por exemplo, se quisermos obter a média (mean()), e a soma (sum()) das linhas de uma coluna, a summarize é capaz de fazer isso.

# Resumindo dados
data_2 %>% 
  summarize(Media_idade = mean(idade))
##   Media_idade
## 1        33.6
data_2 %>% 
  summarize(Soma_idade = sum(idade))
##   Soma_idade
## 1        168

group_by: Agrupando dados

Em muitos casos, nós queremos realizar cálculos com categorias ou grupos diferentes. Por exemplo, considere que queremos saber a média (mean()) das idades por categoria da classificação pelo IMC, e além disso, queremos contar os indíviduos em cada categoria (n()). Para isso, temos de agrupar os dados por categorias (sobrepeso, normal, etc.) de uma variável (classificacao). Isso é feito com o group_by() seguido pelo summarize().

#Média dos grupos
data_2 %>% 
  group_by(classificacao) %>% 
  summarize(Media_idade = mean(idade))
## # A tibble: 3 × 2
##   classificacao Media_idade
##   <chr>               <dbl>
## 1 magreza              31  
## 2 normal               40  
## 3 obesidade 1          28.5
#Contagem
data_2 %>% 
  group_by(classificacao) %>% 
  summarize(individuos = n())
## # A tibble: 3 × 2
##   classificacao individuos
##   <chr>              <int>
## 1 magreza                1
## 2 normal                 2
## 3 obesidade 1            2

arrange(): Ordenando dados

Podemos ordenar os dados de forma crescente e decrescente usando o arrange().

# Ordenando dados de forma crescente
data_2 %>% 
  arrange(idade)
##       nome altura idade peso      imc classificacao
## 1    Júlia   1.60    25   80 31.25000   obesidade 1
## 2 Gabriela   1.59    30   50 19.77770        normal
## 3  Beatriz   1.78    31   40 12.62467       magreza
## 4    Luiza   1.73    32  100 33.41241   obesidade 1
## 5  Rafaela   1.85    50   70 20.45289        normal
# Ordenando de forma decrescente
#Método 1
data_2 %>% 
  arrange(desc(idade))
##       nome altura idade peso      imc classificacao
## 1  Rafaela   1.85    50   70 20.45289        normal
## 2    Luiza   1.73    32  100 33.41241   obesidade 1
## 3  Beatriz   1.78    31   40 12.62467       magreza
## 4 Gabriela   1.59    30   50 19.77770        normal
## 5    Júlia   1.60    25   80 31.25000   obesidade 1
#Método 2
data_2 %>% 
  arrange(-idade)
##       nome altura idade peso      imc classificacao
## 1  Rafaela   1.85    50   70 20.45289        normal
## 2    Luiza   1.73    32  100 33.41241   obesidade 1
## 3  Beatriz   1.78    31   40 12.62467       magreza
## 4 Gabriela   1.59    30   50 19.77770        normal
## 5    Júlia   1.60    25   80 31.25000   obesidade 1

Usando o pipe para fazer múltiplas operações de uma vez

Usando o pipe, podemos escrever e ler códigos em uma sequência lógica fácil.

Por exemplo, abaixo:

  1. pegamos a tabela data_2, ordenamos a altura na ordem crescente,
  2. filtramos somente as pessoas com idade acima de 30 e peso acima de 50 e retiramos os nomes.
  3. Depois, arredondamos os valores do IMC para uma casa decimal (usando round()) e criamos uma nova variável chamada peso_x_idade.
  4. Por fim, resumimos os dados usando a média do peso e a média do imc, e criamos uma variável chamada mega_pipe
# Múltiplas operações em uma caixa
mega_pipe = data_2 %>% 
  arrange(altura) %>% 
  filter(idade >= 30,
         peso >= 50) %>% 
  select(-nome) %>% 
  mutate(imc = round(imc, 1),
         peso_x_idade = peso * idade) %>%
  summarise(mean_peso = mean(peso),
            mean_peso = round(mean_peso, 1),
            mean_imc = mean(imc) %>% round(1))
mega_pipe
##   mean_peso mean_imc
## 1      73.3     24.6

4. Trabalhando com dados reais

Importando tabelas

Podemos importar tabelas de forma manual, clicando no nome do arquivo no quadrante onde encontramos a aba “Files” e selecionando “Import dataset”, que é realizado pelo pacote readr.

Caso queira deixar automatizado, você pode copiar o código que é gerado e colar no seu bloco de código aqui.

A função read_csv() acessa o local do seu arquivo (no caso, do tipo .csv) e o importa para o ambiente do R. Existem funções para importar cada tipo de arquivo, como excel, tsv, etc.

#Pelo readr
cobertura_vacinal <- read_csv("cobertura_vacinal_anotada.csv")  
## New names:
## Rows: 103066 Columns: 11
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (8): name, country_abrev, vaccine, region, type, diseases, region_comple... dbl
## (3): ...1, year, coverage
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
cobertura_vacinal
## # A tibble: 103,066 × 11
##     ...1 name        country_abrev  year vaccine coverage region type   diseases
##    <dbl> <chr>       <chr>         <dbl> <chr>      <dbl> <chr>  <chr>  <chr>   
##  1     1 Afghanistan AFG            2022 BCG           88 ROSA   count… Tubercu…
##  2     2 Afghanistan AFG            2021 BCG           84 ROSA   count… Tubercu…
##  3     3 Afghanistan AFG            2020 BCG           87 ROSA   count… Tubercu…
##  4     4 Afghanistan AFG            2019 BCG           86 ROSA   count… Tubercu…
##  5     5 Afghanistan AFG            2018 BCG           89 ROSA   count… Tubercu…
##  6     6 Afghanistan AFG            2017 BCG           84 ROSA   count… Tubercu…
##  7     7 Afghanistan AFG            2016 BCG           78 ROSA   count… Tubercu…
##  8     8 Afghanistan AFG            2015 BCG           76 ROSA   count… Tubercu…
##  9     9 Afghanistan AFG            2014 BCG           74 ROSA   count… Tubercu…
## 10    10 Afghanistan AFG            2013 BCG           72 ROSA   count… Tubercu…
## # ℹ 103,056 more rows
## # ℹ 2 more variables: region_complete <chr>, continent <chr>
#Tabela de mortes por doença
mortes_doencas <- read_rds("Deaths_infectious_diseases_filtered.rds") 

mortes_doencas
## # A tibble: 43,076 × 9
##    name     year total_deaths perc_deaths death_rate_100thousand
##    <chr>   <dbl>        <dbl>       <dbl>                  <dbl>
##  1 Albania  1987           69      0.398                   2.24 
##  2 Albania  1988           58      0.336                   1.85 
##  3 Albania  1989           50      0.275                   1.57 
##  4 Albania  1992           24      0.139                   0.752
##  5 Albania  1993           27      0.162                   0.852
##  6 Albania  1994           19      0.127                   0.593
##  7 Albania  1995           17      0.106                   0.523
##  8 Albania  1996            6      0.0358                  0.183
##  9 Albania  1997           13      0.0803                  0.391
## 10 Albania  1998            5      0.0303                  0.149
## # ℹ 43,066 more rows
## # ℹ 4 more variables: death_rate_100thousand_age_standardized <dbl>,
## #   death_disease <chr>, continent <chr>, region_complete <chr>

Padronizando tabelas

Para trabalharmos de forma fácil com uma tabela, precisamos padronizá-la.

Isso significa que trocaremos e reordenaremos os nomes das colunas para fazerem mais sentido, completaremos os valores NA quando for possível (e fizer sentido), e explicitaremos algumas coisas, como o nome das doenças contra as quais as vacinas protegem, e daremos o nome completo de cada região, pois somente temos os códigos delas.

No caso dos valores NA, sabemos que certas vacinas não estavam disponíveis para todos os países ao mesmo tempo. Por isso, deixaremos como NA e não trocaremos por 0. Valores faltantes são diferentes de 0, por mais que em muitos casos possam ser trocados.

#Organizar colunas
cobertura_vacinal = cobertura_vacinal %>% 
  select(-"...1", type, name, country_abrev, continent, region, region_complete, year, everything())

#Salvar
cobertura_vacinal %>% 
  saveRDS(file = "cobertura_vacinal_anotada_2.rds")
#Organizar colunas
mortes_doencas = mortes_doencas %>% 
  select(name, continent,region_complete, everything())

#Salvar
mortes_doencas %>% 
  saveRDS(file = "mortes_doencas.rds")

mortes_doencas
## # A tibble: 43,076 × 9
##    name    continent region_complete          year total_deaths perc_deaths
##    <chr>   <chr>     <chr>                   <dbl>        <dbl>       <dbl>
##  1 Albania Europe    Europe and Central Asia  1987           69      0.398 
##  2 Albania Europe    Europe and Central Asia  1988           58      0.336 
##  3 Albania Europe    Europe and Central Asia  1989           50      0.275 
##  4 Albania Europe    Europe and Central Asia  1992           24      0.139 
##  5 Albania Europe    Europe and Central Asia  1993           27      0.162 
##  6 Albania Europe    Europe and Central Asia  1994           19      0.127 
##  7 Albania Europe    Europe and Central Asia  1995           17      0.106 
##  8 Albania Europe    Europe and Central Asia  1996            6      0.0358
##  9 Albania Europe    Europe and Central Asia  1997           13      0.0803
## 10 Albania Europe    Europe and Central Asia  1998            5      0.0303
## # ℹ 43,066 more rows
## # ℹ 3 more variables: death_rate_100thousand <dbl>,
## #   death_rate_100thousand_age_standardized <dbl>, death_disease <chr>

Explorando dados

Visualizando tabelas

# Explorando dados -----

# Tabela completa
view(cobertura_vacinal) 

# Descrição geral
glimpse(cobertura_vacinal)
## Rows: 103,066
## Columns: 11
## $ name            <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanis…
## $ country_abrev   <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG"…
## $ year            <dbl> 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, …
## $ vaccine         <chr> "BCG", "BCG", "BCG", "BCG", "BCG", "BCG", "BCG", "BCG"…
## $ coverage        <dbl> 88, 84, 87, 86, 89, 84, 78, 76, 74, 72, 78, 71, 68, 64…
## $ region          <chr> "ROSA", "ROSA", "ROSA", "ROSA", "ROSA", "ROSA", "ROSA"…
## $ type            <chr> "country", "country", "country", "country", "country",…
## $ diseases        <chr> "Tuberculosis", "Tuberculosis", "Tuberculosis", "Tuber…
## $ region_complete <chr> "South Asia", "South Asia", "South Asia", "South Asia"…
## $ continent       <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia"…
## $ ...1            <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
# Primeiras 10 linhas
head(cobertura_vacinal, 10)
## # A tibble: 10 × 11
##    name        country_abrev  year vaccine coverage region type    diseases    
##    <chr>       <chr>         <dbl> <chr>      <dbl> <chr>  <chr>   <chr>       
##  1 Afghanistan AFG            2022 BCG           88 ROSA   country Tuberculosis
##  2 Afghanistan AFG            2021 BCG           84 ROSA   country Tuberculosis
##  3 Afghanistan AFG            2020 BCG           87 ROSA   country Tuberculosis
##  4 Afghanistan AFG            2019 BCG           86 ROSA   country Tuberculosis
##  5 Afghanistan AFG            2018 BCG           89 ROSA   country Tuberculosis
##  6 Afghanistan AFG            2017 BCG           84 ROSA   country Tuberculosis
##  7 Afghanistan AFG            2016 BCG           78 ROSA   country Tuberculosis
##  8 Afghanistan AFG            2015 BCG           76 ROSA   country Tuberculosis
##  9 Afghanistan AFG            2014 BCG           74 ROSA   country Tuberculosis
## 10 Afghanistan AFG            2013 BCG           72 ROSA   country Tuberculosis
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>
# Últimas 10 linhas
tail(cobertura_vacinal, 10)
## # A tibble: 10 × 11
##    name  country_abrev  year vaccine coverage region type   diseases            
##    <chr> <chr>         <dbl> <chr>      <dbl> <chr>  <chr>  <chr>               
##  1 WCAR  WCAR           2022 HEPBB         28 WCAR   region Hepatitis B         
##  2 WCAR  WCAR           2022 HIB3          69 WCAR   region Haemophilus influen…
##  3 WCAR  WCAR           2022 IPV1          70 WCAR   region Poliomielitis       
##  4 WCAR  WCAR           2022 MCV1          64 WCAR   region Measles             
##  5 WCAR  WCAR           2022 MCV2          32 WCAR   region Measles             
##  6 WCAR  WCAR           2022 PCV3          64 WCAR   region Pneumococcus        
##  7 WCAR  WCAR           2022 POL3          68 WCAR   region Poliomielitis       
##  8 WCAR  WCAR           2022 RCV1          20 WCAR   region Rotavirus           
##  9 WCAR  WCAR           2022 ROTAC         44 WCAR   region Rotavirus           
## 10 WCAR  WCAR           2022 YFV           62 WCAR   region Yellow fever        
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>
#Summary statistics
summary(cobertura_vacinal)
##      name           country_abrev           year        vaccine         
##  Length:103066      Length:103066      Min.   :1980   Length:103066     
##  Class :character   Class :character   1st Qu.:1990   Class :character  
##  Mode  :character   Mode  :character   Median :2001   Mode  :character  
##                                        Mean   :2001                     
##                                        3rd Qu.:2012                     
##                                        Max.   :2022                     
##                                                                         
##     coverage        region              type             diseases        
##  Min.   : 0.00   Length:103066      Length:103066      Length:103066     
##  1st Qu.:75.00   Class :character   Class :character   Class :character  
##  Median :90.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :81.46                                                           
##  3rd Qu.:97.00                                                           
##  Max.   :99.00                                                           
##  NA's   :39349                                                           
##  region_complete     continent              ...1       
##  Length:103066      Length:103066      Min.   :     1  
##  Class :character   Class :character   1st Qu.: 25767  
##  Mode  :character   Mode  :character   Median : 51534  
##                                        Mean   : 51534  
##                                        3rd Qu.: 77300  
##                                        Max.   :103066  
## 

Cada coluna contendo strings repetidas nas linhas podem ser reduzidas aos valores únicos.

Por exemplo, veja que as regiões, por estarem na tabela longa, são repetidas para cada país. Se quisermos saber todas as regiões incluídas no dataset de forma mais fácil, sem ficar procurando uma por uma, usamos o unique().

#Níveis de colunas
unique(cobertura_vacinal$region_complete)
## [1] "South Asia"                   "Europe and Central Asia"     
## [3] "Middle East and North Africa" "Eastern and Southern Africa" 
## [5] "Latin America and Caribbean"  "Non-programme"               
## [7] "West and Central Africa"      "East Asia and Pacific"       
## [9] "Global"
unique(cobertura_vacinal$name) %>% 
  head(10)
##  [1] "Afghanistan" "Albania"     "Algeria"     "Angola"      "Argentina"  
##  [6] "Armenia"     "Austria"     "Azerbaijan"  "Bangladesh"  "Belarus"
unique(cobertura_vacinal$vaccine) %>% 
  head(10)
##  [1] "BCG"   "DTP1"  "DTP3"  "HEPB3" "HEPBB" "HIB3"  "IPV1"  "MCV1"  "MCV2" 
## [10] "PCV3"

E se quisermos contar quantas vezes esses valores são repetidos no dataset? Podemos usar o count() seguido por head(), para visualizar os 10 primeiros valores. O head() é importante quando temos uma tabela muito grande e não queremos ver todos os valores.

#Contar linhas por coluna
cobertura_vacinal %>% 
  count(name) %>% 
  head(10)
## # A tibble: 10 × 2
##    name                    n
##    <chr>               <int>
##  1 Afghanistan           516
##  2 Albania               559
##  3 Algeria               516
##  4 Andorra               473
##  5 Angola                559
##  6 Antigua and Barbuda   430
##  7 Argentina             602
##  8 Armenia               559
##  9 Australia             473
## 10 Austria               473
cobertura_vacinal %>% 
  count(vaccine) %>% 
  head(10)
## # A tibble: 10 × 2
##    vaccine     n
##    <chr>   <int>
##  1 BCG      7611
##  2 DTP1     8772
##  3 DTP3     8772
##  4 HEPB3    8555
##  5 HEPBB    4808
##  6 HIB3     8639
##  7 IPV1     8457
##  8 MCV1     8772
##  9 MCV2     8248
## 10 PCV3     6800
cobertura_vacinal %>% 
  count(region_complete) %>% 
  head(10)
## # A tibble: 9 × 2
##   region_complete                  n
##   <chr>                        <int>
## 1 East Asia and Pacific        15551
## 2 Eastern and Southern Africa  12008
## 3 Europe and Central Asia      11337
## 4 Global                         441
## 5 Latin America and Caribbean  17727
## 6 Middle East and North Africa 10761
## 7 Non-programme                17916
## 8 South Asia                    4371
## 9 West and Central Africa      12954

Temos também uma forma de contar a frequência dessas linhas. Veja que há uma diferença nas observações/linhas por região, sendo a região da américa latina a que mais contém observações, e a região do sul-asiático a que tem menos. No caso de “Global”, esses dados se referem à cobertura vacinal do conjunto de todos os países para cada vacina, e por isso tem n = 441.

#Tabela de frequências
cobertura_vacinal %>% 
  tabyl(region_complete) %>% 
  head(10)
##               region_complete     n     percent
##         East Asia and Pacific 15551 0.150883900
##   Eastern and Southern Africa 12008 0.116507869
##       Europe and Central Asia 11337 0.109997477
##                        Global   441 0.004278812
##   Latin America and Caribbean 17727 0.171996585
##  Middle East and North Africa 10761 0.104408825
##                 Non-programme 17916 0.173830361
##                    South Asia  4371 0.042409718
##       West and Central Africa 12954 0.125686453

Dados faltantes

# Dados faltantes ----
skim(cobertura_vacinal) # Por que são faltantes? Precisamos deles?
Data summary
Name cobertura_vacinal
Number of rows 103066
Number of columns 11
_______________________
Column type frequency:
character 8
numeric 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
name 0 1 4 37 0 204 0
country_abrev 0 1 3 13 0 204 0
vaccine 0 1 3 5 0 14 0
region 0 1 4 13 0 9 0
type 0 1 6 7 0 2 0
diseases 0 1 4 28 0 10 0
region_complete 0 1 6 28 0 9 0
continent 0 1 4 13 0 15 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1.00 2001.12 12.41 1980 1990.00 2001.0 2012.00 2022 ▇▇▇▇▇
coverage 39349 0.62 81.46 22.10 0 75.00 90.0 97.00 99 ▁▁▁▂▇
…1 0 1.00 51533.50 29752.74 1 25767.25 51533.5 77299.75 103066 ▇▇▇▇▇
# Como são essas linhas?
cobertura_vacinal %>% 
  filter(!complete.cases(.)) %>% 
  head(10)
## # A tibble: 10 × 11
##    name        country_abrev  year vaccine coverage region type    diseases    
##    <chr>       <chr>         <dbl> <chr>      <dbl> <chr>  <chr>   <chr>       
##  1 Afghanistan AFG            1981 BCG           NA ROSA   country Tuberculosis
##  2 Afghanistan AFG            1980 BCG           NA ROSA   country Tuberculosis
##  3 Algeria     DZA            1984 BCG           NA MENA   country Tuberculosis
##  4 Algeria     DZA            1983 BCG           NA MENA   country Tuberculosis
##  5 Algeria     DZA            1982 BCG           NA MENA   country Tuberculosis
##  6 Algeria     DZA            1981 BCG           NA MENA   country Tuberculosis
##  7 Algeria     DZA            1980 BCG           NA MENA   country Tuberculosis
##  8 Angola      AGO            1982 BCG           NA ESAR   country Tuberculosis
##  9 Angola      AGO            1981 BCG           NA ESAR   country Tuberculosis
## 10 Angola      AGO            1980 BCG           NA ESAR   country Tuberculosis
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>

Estatísticas descritivas

Abaixo, queremos obter o resumo dos dados de cada país na região da América latina. Como a tabela tem linhas com dados faltantes, algumas operações podem confundir os resultados. Por isso, usamos a função drop_na().

Além disso, queremos filtrar somente os dados dos países latinoamericanos entre os anos 2000 e 2023. Para isso, usamos o between() dentro da função filter(), e especificamos que queremos o type == "country", pois também temos dados da região como um todo.

Como não queremos trabalhar com os nomes completos das regiões, podemos ser menos específicos. Por exemplo, se sabemos que existe a região “Latin America and Caribbean Region (LACR)”, podemos somente usar uma função que pega um pedaço do nome completo e nos retorna aquela linha. Isso é feito com o str_detect().

Para calcularmos as estatísticas gerais com summarize, precisamos agrupar os dados com group_by(). Isso porque temos dados da cobertura vacinal por país em 23 anos e para mais de uma vacina. Dessa forma, agruparemos por país (name) e vacina (vaccine). Ao final, vamos desagrupar esses dados.

As tabelas produzidas a seguir serão utilizadas para trabalharmos a visualização dos dados!

Por país

Veja quais são os países da américa latina que mais vacinaram ao longo de 2000 a 2023, por vacina.

latin_2000_2023 = cobertura_vacinal %>% 
  
  #Missing values: Aqui, é importante retirá-los para não repetir linhas
  
  drop_na(coverage) %>% 
   
  #Filtrando os dados no intervalo e
  filter(between(year, 2000, 2022),
         str_detect(region_complete, "Latin"),
         type == "country") %>% 
  
  #Agrupar por vacina e país
  group_by(vaccine, name) %>% 
  
  #Resumir estatísticas
  # Estatísticas da cobertura vacinal para cada país em um continente
  # Média, mediana, mínimo e máximo de uma variável numérica
  summarise(
    mean = mean(coverage),
    median = median(coverage),
    max = max(coverage),
    min = min(coverage),
    sd = sd(coverage),
    var = var(coverage)
  ) %>% 
  
  #Ordenar continentes pela mediana de forma decrescente 
  arrange(vaccine, desc(mean)) %>% 
  
  #Desagrupar
  ungroup()
## `summarise()` has grouped output by 'vaccine'. You can override using the
## `.groups` argument.
latin_2000_2023
## # A tibble: 402 × 8
##    vaccine name                   mean median   max   min    sd    var
##    <chr>   <chr>                 <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1 BCG     Cuba                   99       99    99    99 0      0    
##  2 BCG     Uruguay                98.7     99    99    97 0.559  0.312
##  3 BCG     Panama                 98.6     99    99    95 0.941  0.885
##  4 BCG     Dominica               97.2     98    99    89 2.81   7.88 
##  5 BCG     Dominican Republic     96.5     98    99    85 3.65  13.4  
##  6 BCG     Guyana                 96.2     97    99    90 2.56   6.54 
##  7 BCG     Saint Kitts and Nevis  96.2     97    99    89 2.84   8.09 
##  8 BCG     Chile                  96.1     96    99    91 2.28   5.21 
##  9 BCG     Nicaragua              96       99    99    86 4.35  18.9  
## 10 BCG     Belize                 95.5     98    99    76 5.55  30.8  
## # ℹ 392 more rows

Por continente

Veja quais são os continentes que mais vacinaram ao longo de 2000 a 2023, por vacina.

# Cobertura vacinal: Estatísticas de cada continente
continentes_vac = cobertura_vacinal %>% 
  
  drop_na(coverage,
          continent) %>% 
  
  filter(between(year, 2000, 2023),
         type == "country") %>% 
  
  group_by(vaccine, continent) %>% 
  
  summarise(
    mean = mean(coverage),
    median = median(coverage),
    max = max(coverage),
    min = min(coverage),
    sd = sd(coverage),
    var = var(coverage)
  ) %>% 
  
  #Ordenar continentes pela mediana de forma decrescente 
  arrange(vaccine, desc(mean)) %>% 
  
  ungroup()
## `summarise()` has grouped output by 'vaccine'. You can override using the
## `.groups` argument.
#Visualizar
continentes_vac
## # A tibble: 79 × 8
##    vaccine continent  mean median   max   min    sd    var
##    <chr>   <chr>     <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1 BCG     Americas   93.6     96    99    28  7.36  54.2 
##  2 BCG     Other      92.3     96    99     0 10.4  109.  
##  3 BCG     Asia       91.7     96    99    29 10.8  117.  
##  4 BCG     Europe     86.7     97    99    16 23.6  557.  
##  5 BCG     Africa     85.4     90    99    26 14.5  211.  
##  6 DTP1    Europe     97.2     98    99    84  2.34   5.47
##  7 DTP1    Oceania    94.8     95    98    90  2.50   6.25
##  8 DTP1    Americas   94.3     96    99    73  5.50  30.2 
##  9 DTP1    Other      93.5     98    99    39  9.46  89.4 
## 10 DTP1    Asia       92.4     96    99    45  8.95  80.0 
## # ℹ 69 more rows

Mortes cumulativas

Por continente

# Mortes cumulativas
# Estatísticas de cada continente
continentes_mortes = mortes_doencas %>% 
  
  drop_na(total_deaths,
          continent) %>%
  
  filter(between(year, 2000, 2023)) %>% 
  
  group_by(death_disease, continent) %>%
  
  summarise(
    cumulativo = sum(total_deaths),
    mean = mean(total_deaths),
    median = median(total_deaths),
    max = max(total_deaths),
    min = min(total_deaths),
    sd = sd(total_deaths),
    var = var(total_deaths)
  ) %>% 
  
  #Aqui, queremos os países com maior número de mortes
  arrange(death_disease, - cumulativo) %>% 
  
  
  ungroup()
## `summarise()` has grouped output by 'death_disease'. You can override using the
## `.groups` argument.
continentes_mortes
## # A tibble: 54 × 9
##    death_disease continent cumulativo    mean median   max   min      sd     var
##    <chr>         <chr>          <dbl>   <dbl>  <dbl> <dbl> <dbl>   <dbl>   <dbl>
##  1 Diphteria     Asia             516 2.53e+0     0     31     0 6.33e+0 4.00e+1
##  2 Diphteria     Other            428 5.95e-1     0     56     0 3.81e+0 1.45e+1
##  3 Diphteria     Americas         166 4.32e-1     0     11     0 1.47e+0 2.17e+0
##  4 Diphteria     Europe            39 7.78e-2     0      3     0 3.46e-1 1.20e-1
##  5 Diphteria     Africa            27 4.35e-1     0      3     0 7.81e-1 6.11e-1
##  6 Diphteria     Oceania            4 1.03e-1     0      1     0 3.07e-1 9.45e-2
##  7 Hepatitis B   Africa        107959 1.74e+3   264.  7771     0 2.63e+3 6.92e+6
##  8 Hepatitis B   Other          57779 8.02e+1     4   2262     0 2.61e+2 6.81e+4
##  9 Hepatitis B   Asia           44701 2.19e+2    21   1352     0 3.41e+2 1.16e+5
## 10 Hepatitis B   Americas       36628 9.54e+1    27    942     0 1.93e+2 3.73e+4
## # ℹ 44 more rows

Por país

# Mortes cumulativas
# Estatísticas de cada país
paises_mortes = mortes_doencas %>% 
  drop_na(total_deaths,
          name) %>% 
  filter(between(year, 2000, 2023)) %>% 
  group_by(death_disease, name) %>% 
  summarise(
    cumulativo = sum(total_deaths),
    mean = mean(total_deaths),
    median = median(total_deaths),
    max = max(total_deaths),
    min = min(total_deaths),
    sd = sd(total_deaths),
    var = var(total_deaths)
  ) %>% 
  arrange(death_disease, desc(cumulativo)) %>% 
  ungroup()
## `summarise()` has grouped output by 'death_disease'. You can override using the
## `.groups` argument.
paises_mortes
## # A tibble: 1,062 × 9
##    death_disease name         cumulativo  mean median   max   min     sd     var
##    <chr>         <chr>             <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>   <dbl>
##  1 Diphteria     Philippines         325 21.7      23    31     7  6.49   42.1  
##  2 Diphteria     Russian Fed…        253 12.6       1    56     0 18.1   327.   
##  3 Diphteria     Thailand            121  6.37      6    13     2  3.00    9.02 
##  4 Diphteria     Brazil               84  4         4    11     0  3.11    9.7  
##  5 Diphteria     Iraq                 47 15.7      13    23    11  6.43   41.3  
##  6 Diphteria     Latvia               43  1.95      1    11     0  2.97    8.81 
##  7 Diphteria     Dominican R…         38  2         1     9     0  2.71    7.33 
##  8 Diphteria     Syrian Arab…         29  2.64      3     5     0  1.69    2.85 
##  9 Diphteria     Venezuela (…         24  1.41      0    24     0  5.82   33.9  
## 10 Diphteria     South Africa         23  1.21      1     3     0  0.976   0.953
## # ℹ 1,052 more rows

5. Visualização

A visualização com o ggplot2 é feito em camadas. Primeiro, temos um dataframe com os dados de interesse, depois chamamos a função ggplot() e adicionamos um +, que funciona aqui como um pipe, mas somente para gráficos. A partir disso, temos de mapear os eixos, cores, tamanho, etc. com as variáveis de interesse, usando o aes(). Para definir qual tipo de gráfico iremos criar, temos de definir a geometria (geom_), que no caso é de pontos (geom_point()). Isso já produz um gráfico, mas não é um dos melhores.

Para melhorar, podemos adicionar mais funções, como labels para os pontos do gráfico (geom_label()), um tema pré-definido (theme_light()) ou customizável (theme()), e título para o gráfico, eixos, e legendas (labs()). Além disso, para reordenar os valores de uma variável categórica, como os países, por uma variável numérica, usamos o fct_reorder() dentro do mutate().

Vacinação

Gráfico de pontos simples

Por continente

#Gráfico de pontos simples
continentes_pontos_vac = continentes_vac %>% #Dataframe
  filter(vaccine %in% "MCV1") %>%
  mutate(continent = fct_reorder(continent, median)) %>% 
  
  #Chamando a função. Aqui se usa "+" em vez de "%>%"
  ggplot() +  
  
  #Mapeando os eixos
  aes(x = median,
      y = continent,
      color = continent) +
  
  #Geometrias
  geom_point() +
  
  #Labels nos pontos
  geom_label(aes(x = median, 
                y = continent, 
                label = median)) +
  
  #Tema
  theme_light() +
  
  #Títulos
  labs(title = "Cobertura vacinal",
       x = "Mediana (Cobertura vacinal %)",
       y = "Continentes") 

continentes_pontos_vac

Por país

#Gráfico de pontos simples
pontos = latin_2000_2023 %>% #Dataframe
  filter(vaccine %in% "MCV1") %>%
  mutate(name = fct_reorder(name, median)) %>% 

  ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%" 
  
  #Mapeando os eixos
  aes(x = median,
      y = name,
      color = median) +
  
  #Geometrias
  geom_point() +
  
  geom_text(aes(x = median, #Use geom_label para visualizar melhor
                y = name, 
                label = median),
            hjust = -0.5) +
  
  #Tema
  theme_light() +
  
  #Labels
  labs(title = "Cobertura vacinal",
       x = "Mediana (Cobertura vacinal%)",
       y = "Países") +
  
  #Limites
  xlim(60, 105)

pontos

Gráfico de barras

Por continente

#Gráfico de barras simples
continente_barras_vac = continentes_vac %>% #Dataframe
  filter(vaccine %in% "MCV1") %>%
  mutate(continent = fct_reorder(continent, median)) %>% 
  ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%" 
  
  #Mapeando os eixos
  aes(x = median,
      y = continent,
      fill = continent) +
  
  #Geometrias
  geom_col() +
  
  geom_text(aes(x = median, 
                y = continent, 
                label = median),
            hjust = -0.5) +
  
  #Tema
  theme_light() +
  
  #Labels
  labs(title = "Cobertura vacinal",
       x = "Mediana (Cobertura vacinal %)",
       y = "Continentes")  +
  
  #Limites
  xlim(0, 105)

continente_barras_vac

Por país

#Gráfico de barras simples
pais_barras_vac = latin_2000_2023 %>% #Dataframe
  filter(vaccine %in% "MCV1") %>%
  mutate(name = fct_reorder(name, median)) %>% 
  ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%" 
  
  #Mapeando os eixos
  aes(x = median,
      y = name,
      fill = median) +
  
  #Geometrias
  geom_col() +
  
  geom_text(aes(x = median, 
                y = name, 
                label = median),
            hjust = -0.5) +
  
  #Tema
  theme_light() +
  
  #Labels
  labs(title = "Países com cobertura vacinal para sarampo, entre 2000 e 2023",
       x = "Mediana (Cobertura vacinal%)",
       y = "Países") +
  
  xlim(0, 105)

pais_barras_vac

Mortes

Por continente

#Gráfico de pontos simples
barras_mortes = continentes_mortes %>% #Dataframe
  filter(death_disease == "Measles") %>% 
  mutate(continent = fct_reorder(continent, cumulativo)) %>% 
  ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%" 
  
  #Mapeando os eixos
  aes(x = cumulativo,
      y = continent,
      fill = continent) +
  
  #Geometrias
  geom_col() +
  
  geom_label(aes(x = cumulativo, 
                y = continent, 
                label = cumulativo),
            hjust = -0.2) +
  
  #Tema
  theme_light() +
  
  #Labels
  labs(title = "Mortes cumulativas por Sarampo, de 2000 a 2023",
       x = "Mortes",
       y = "Continentes") +
  
  #Eixo x
  xlim(0, 10000) #Aumentar limites 
  
barras_mortes 

#Gráfico de barras simples
paises_barras_mortes = paises_mortes %>% #Dataframe
  filter(death_disease == "Measles") %>% 
  mutate(name = fct_reorder(name, cumulativo)) %>% 
  slice_max(order_by = cumulativo, n = 10) %>% 
  ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%" 
  
  #Mapeando os eixos
  aes(x = cumulativo,
      y = name,
      fill = name) +
  
  #Geometrias
  geom_col() +
  
  geom_label(aes(x = cumulativo, 
                y = name, 
                label = cumulativo),
            hjust = -0.2) +
  
  #Tema
  theme_light() +
  
  #Labels
  labs(title = "Mortes cumulativas por Sarampo, de 2000 a 2023",
       x = "Mortes",
       y = "Continentes") +
  
  #Eixo x
  xlim(0, 10000) #Aumentar limites 
  
paises_barras_mortes

Visualização rápida com o Esquisse

Lembre-se de retirar os # antes de rodar.

#Visualização rápida
# latin_2000_2023 %>%
#    esquisser()

Melhorando o gráfico

# Melhorando o gráfico -----

plot = 
  
  # Manipular tabela
  latin_2000_2023 %>%
  filter(vaccine %in% "MCV1") %>%
  mutate(name = fct_reorder(name, median)) %>% 
 
  #Criar base do gráfico
  ggplot() +
  aes(x = median, y = name, colour = median) + #Aesthetics (mapping)
  
  #Geometria
  geom_point(shape = "circle", 
             size = 1) +
  #Highlight (add sempre após geom_)
  gghighlight(median >= 95,
              label_key = name,
              label_params = list(size = 3),
              unhighlighted_params = list(colour = "red")) +
  
  #Marcações
  #Linhas
  geom_vline(xintercept = 95,
             colour = "black",
             size =0.2,
             linetype = 2) +
  
  #Tema, aparência
  theme_light() + 
  
  # Labels, titulo, subtitulo, titulo dos eixos
    
  labs(title = "Vacinação em países da América Latina",
     subtitle = "Sarampo, MCV1, Dose 1, entre 2000 e 2023",
     y = "Países",
     x = "Mediana (Cobertura %)",
     tag = "Figure A.",
     colour = "Cobertura vacinal",
     caption = "Fonte: Feito pela UPVacina") +
  
  # Aparência especifica
  theme(
    
    #Texto geral
    text = element_text(family = "sans",  #sans, mono, serif
                        color = "black"), 
    
    #Título, subtítulo e tag
    plot.title = element_text(size = 12, 
                              face = "bold", 
                              hjust = 0,
                              vjust = 0.5),
    plot.subtitle = element_text(size = 10),
    plot.tag.position = "topleft",
    plot.tag = element_text(vjust = 5,
                            size = 12, 
                            face = "bold"),
    
    #Legenda
    legend.title = element_text(face = "bold"),
    legend.text = element_text(size = 10),
    
    #Eixos
    axis.title.x = element_text(size = 10,
                                angle = 0,
                                color = "black"),
    axis.text.x = element_text(color = "black",
                               size = 8,
                               angle = 0),
    axis.text.y = element_text(size = 8,
                               color = "black"),
    
    #Margens do gráfico
    plot.margin = unit(c(0.5, #Top
                         1, #Right
                         0.5, #Bottom
                         0), #Left 
                       "cm") #Unidade) 
  ) 
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#Visualizar
plot

#Salvar
ggsave(plot, file = "Sarampo_LatinAmerica_2000_2023.png", width = 10, height = 5)

Gráfico interativo

plot %>% 
  ggplotly() 
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues

## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues

## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues

## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues

## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues

Unindo gráficos

#Unindo gráficos -----
vaccination = cobertura_vacinal %>% 
  filter(name == "Brazil",
         vaccine == "MCV1") %>% 
    ggplot() +
  geom_line(mapping = aes(
    x = year,
    y = coverage),
    colour = "#4DBBD5B2",
    linewidth = 2) +
    geom_text(aes(x = year, 
                  y = coverage, 
                  label = coverage),
            vjust = -0.5,
            size = 2) +
    theme_minimal() +
  labs(title = "Cobertura vacinal contra o sarampo, Brasil",
       x = "Ano",
       y = "Cobertura vacinal (%)") +
   ylim(0, 110)

vaccination

#Mortes
deaths = mortes_doencas %>% 
  filter(name == "Brazil",
         death_disease == "Measles") %>% 
    ggplot() +
  aes(x = year, y = total_deaths) +
  geom_col(fill = "#DC0000B2") +
  geom_text(aes(label = total_deaths),
            vjust = -0.5,
            size = 2) +
  theme_minimal() +
  theme(text = element_text(size = 10)) +
    labs(title = "Mortes por sarampo, Brasil",
       x = "Ano",
       y = "Mortes") +
   ylim(0, 3400)

deaths

Unindo gráficos em uma imagem

#Unir gráficos
(vaccination / deaths) 

(vaccination + deaths) 

#Salvar
(vaccination / deaths) %>% 
  ggsave(file = "Sarampo_Brasil_1980_2023.png", width = 10, height = 5)

Boxplots

#Boxplot simples por ano
boxplot_years = cobertura_vacinal %>% 
  filter(type == "country",
         vaccine == "MCV1",
         year %in% c(1990, 2000, 2010, 2019)) %>% 
  
  
 ggplot() +
  aes(x = "", 
      y = coverage, 
      fill = continent) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2", direction = 1) +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 45,
                                   vjust = 1,
                                   hjust = 1),
        plot.margin = unit(c(1, 1, 1, 1), "cm"),
        legend.position = "right") +
  
  facet_wrap(vars(year), ncol = 4) +
  
  labs(title = "Cobertura vacinal contra o sarampo",
       subtitle = "Primeira dose (MCV1)",
      x = "Região UNICEF",
       y = "Cobertura vacinal (%)",
       fill = "Região UNICEF")

#Visualizar
boxplot_years 
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Paleta de cores científica

# Cores
#Mudando a paleta
library(ggsci)
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
vignette("ggsci") 
## starting httpd help server ...
##  done
nrc = pal_npg("nrc", #Especificar paleta
              alpha = 0.7)(8) #Gerar 8 cores com transparencia = 70%
nrc %>% 
  show_col()

boxplot_years + 
  scale_fill_npg()
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

#Boxplot simples de ano
boxplot_regions = cobertura_vacinal %>% 
  filter(type == "country",
         vaccine == "MCV1",
         year %in% c(1990, 2000, 2010, 2020)) %>% 
  mutate(year = as.factor(year)) %>% 
 ggplot() +
  aes(x = year, y = coverage, fill = year) +
  geom_boxplot() +
  geom_jitter(aes(label = name),
              alpha = 0.2,
              na.rm = T) +
  scale_fill_brewer(palette = "Set2", direction = 1) +
  scale_color_distiller(palette = "Set2", direction = 1) +
  theme_minimal() +
  facet_wrap(vars(continent)) +
  scale_fill_npg()
## Warning in geom_jitter(aes(label = name), alpha = 0.2, na.rm = T): Ignoring
## unknown aesthetics: label
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
boxplot_regions
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

# Gráfico interativo
boxplot_regions %>%  
  ggplotly()
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
#Boxplot por vacina
cobertura_vacinal %>% 
  filter(type == "country",
         year == 2015) %>% 
 ggplot() +
  aes(x = "", y = coverage, fill = continent) +
  geom_boxplot() +
  scale_fill_viridis_d(option = "plasma", direction = 1) +
  theme_minimal() +
  facet_wrap(vars(vaccine)) +
  labs(x = "Regiões",
       y = "Cobertura",
       titulo = "Cobertura vacinal por região, em 2000") +
  scale_fill_lancet()  
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: Removed 216 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Múltiplos gráficos

# Múltiplos gráficos ----
#Todas as linhas
cobertura_vacinal %>%
 filter(year >= 2012 & year <= 2022) %>%
 filter(region %in% "LACR") %>%
 ggplot() +
  aes(x = year, y = coverage, color = name) +
  geom_line() +
  theme_minimal() + 
  facet_wrap(vars(vaccine), scales = "free_x") 

#Fica muito poluído

Isolando linhas com filter()

#Highlight linhas específicas

#Método 1
br_cov = cobertura_vacinal %>%
 filter(year >= 2012 & year <= 2022,
        name %in% c("Brazil", "Colombia")) %>%
 ggplot() +
  aes(x = year, 
      y = coverage,
      colour = name) +
  
  geom_line(linewidth = 2) +

  theme_minimal() +
  
  facet_wrap(vars(vaccine)) + 
  
  labs(title = "Cobertura vacinal, por vacina",
       x = "Ano",
       y = "Cobertura (%)")  +
  
  scale_color_npg() 

br_cov 

Isolando linhas com gghighlight()

#Método 2
br_cov = cobertura_vacinal %>%
 filter(year >= 2012 & year <= 2022,
        region %in% c("LACR")) %>%
 ggplot() +
  
  geom_line(aes(x = year, 
      y = coverage,
      colour = name),
      linewidth = 2) +

  theme_minimal() +
  
  theme(axis.text.x = element_text(angle = 90)) +
  
  facet_wrap(vars(vaccine)) + 
  
  labs(title = "Cobertura vacinal, por vacina",
       x = "Ano",
       y = "Cobertura (%)") +
  
  gghighlight(name %in% c("Brazil", "Colombia"), 
              calculate_per_facet = T, #Add quando tiver facets
              unhighlighted_params = list(linewidth = 1, 
                                          colour = "gray90", 
                                          alpha = 0.3)) +
  scale_color_npg() 
## New names:
## • `...1` -> `...15`
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: name
br_cov
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).

#Mortes
br_mortes = mortes_doencas %>%
 filter(year >= 2012 & year <= 2022,
        region_complete == "Latin America and Caribbean") %>% 
  select(name, year, total_deaths, death_rate_100thousand, death_disease) %>% 
  distinct() %>%
  drop_na(total_deaths) %>% 
 ggplot() +
  geom_line(aes(x = round(year, 0), 
      y = total_deaths,
      colour = name),
      linewidth = 2) +

  theme_minimal() +
  
  theme(axis.text.x = element_text(angle = 90))+
  
  facet_wrap(vars(death_disease), 
             scales = "free", 
             nrow = 3) + 
  
  labs(title = "Mortes por doença imunoprevenível",
       x = "Ano",
       y = "Mortes") +
  
  #highlight
  gghighlight(name %in% c("Brazil", "Colombia"), #Linhas somente com name == "Brazil'
              
              calculate_per_facet = T, #Add quando tiver facets
              
              unhighlighted_params = list(linewidth = 1, #Opções para linhas não marcadas
                                          colour = "gray90", 
                                          alpha = 0.5)) + 
  scale_color_npg()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: name
br_mortes 

# Unir gráficos
br_cov + br_mortes
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).

#Salvar
ggsave(br_cov + br_mortes, 
       file = "br_cov_mortes.png",
       width = 15, #Largura
       height = 10) #Altura
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).

6. Modelo

Este modelo é útil para você criar gráficos de forma mais fácil, considerando as layers, funções e argumentos mais utilizados no ggplot. Caso queira gerar outros tipos de gráficos, use diferentes geometrias e consulte o (R graph gallery)[https://r-graph-gallery.com/].

Selecione todo o código e segure Ctrl + Shift + C para tornar as linhas executáveis.

# # Filtrar tabela
# latin_2000_2023 %>%
#   filter(vaccine %in% c("MCV1")) %>%
#   mutate(name = fct_reorder(name, median)) %>% 
#  
#   #Criar base do gráfico
#   ggplot() +
#   aes(x = x, 
#       y = y, 
#       colour = ) + #Aesthetics (o que cada elemento representa)
#   
#   #Geometria
#   geom_point(shape = "circle", 
#              size = 1) + 
#   
#   geom_text(aes(y = )) +
#   
#   #Tema, aparência
#   theme_light() + 
#   
#   #Escala de cores
#   scale_colour_gradient(low = "#DC0000B2", 
#                         high = "#4DBBD5B2") + 
#   
#   # Labels, titulo, subtitulo, titulo dos eixos
#   labs(
#      title = "",
#      subtitle = "",
#      y = "",
#      x = "",
#      tag = "",
#      caption = "Fonte:") +
#   
#   # Aparência especifica
#   theme(
#     
#     #Texto geral
#     text = element_text(family = "", 
#                         color = ""), 
#     
#     #Título, subtítulo e tag
#     plot.title = element_text(size = 12, 
#                               face = "bold", 
#                               hjust = 0,
#                               vjust = 0.5),
#     plot.subtitle = element_text(size = 10),
#     plot.tag.position = "topleft",
#     plot.tag = element_text(vjust = 5,
#                             size = 12, 
#                             face = "bold"),
#     #Eixos
#     axis.title.x = element_text(size = 10,
#                                 angle = 0,
#                                 color = "black"),
#     axis.text.x = element_text(color = "black",
#                                size = 8,
#                                angle = 90),
#     axis.text.y = element_text(size = 8,
#                                color = "black"),
#     
#     #Margens do gráfico
#     plot.margin = unit(c(0, #Top
#                          0, #Right
#                          0, #Bottom
#                          0), #Left 
#                        "cm") #Unidade) 
#   ) +
#   
#   #Marcações
#   #Linhas
#   geom_hline(yintercept = "Brazil", 
#              colour = "blue") +
#   geom_hline(yintercept = "Haiti", 
#               colour = "red") +
#   geom_vline(xintercept = 95,
#              colour = "black",
#              size = 1,
#              linetype = 1
#              ) 

#7. Analisando a distribuição

Quantos países por continente registraram os dados na UNICEF?

#Quantos países por continente registraram os dados na UNICEF?

#Todos os continentes juntos
cobertura_vacinal %>%
 filter(type == "country",
        continent != "Other") %>% 
 select(coverage, year, continent, vaccine) %>% 
 drop_na(coverage) %>% 
 ggplot() +
  aes(x = year, fill = continent) +
  geom_histogram(bins = 43L) +
  theme_minimal() +
  facet_wrap(vars(vaccine)) +
  scale_fill_npg()

Continentes separados

# Continentes separados
cobertura_vacinal %>%
 filter(type == "country",
        continent != "Other") %>% 
 select(coverage, year, continent, vaccine) %>% 
 drop_na(coverage) %>% 
 ggplot() +
  aes(x = year, fill = continent) +
  geom_histogram(bins = 43L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  facet_grid(continent ~ vaccine, 
             scales = "free") +
  theme(axis.text.x = element_text(angle = 90))

Quantos países aumentaram sua cobertura vacinal em cada decada?

#Quantos países aumentaram sua cobertura vacinal em cada decada?

cobertura_vacinal %>%
 filter(type == "country",
        continent != "Other",
        year %in% c(1990, 2000, 2010, 2019)) %>%
 ggplot() +
  aes(x = coverage, fill = continent) +
  geom_histogram(bins = 10L) +
  theme_minimal() +
  theme(plot.caption = element_text(size = 13L),
        legend.position = "top",
        axis.text.x = element_text(angle = 90),
        strip.text.y = element_text(angle = 0, 
                                    hjust = 0)) +
  facet_grid(~vaccine~year, scales = "free") 
## Warning: Removed 1913 rows containing non-finite outside the scale range
## (`stat_bin()`).

#8. Avançado: Dados demográficos e economicos com o Gapminder

O gapminder é um site e um pacote que apresenta diferentes dados sobre países ao longo dos anos. O pacote do R traz uma tabela dos anos 50 até 2007, com dados sobre expectativa de vida, PIB percapita e tamanho da população.

gapminder %>% 
  filter(year %in% c(1952, 1982, 2002)) %>% 
ggplot() +
  aes(
    x = gdpPercap,
    y = lifeExp,
    colour = continent,
    size = pop,
    group = country
  ) +
  geom_point(shape = "circle") +
  scale_x_continuous(trans = "log10") +
  theme_minimal() +
  facet_wrap(vars(year), scales = "free_x") +
  gghighlight(country == "China") +
  scale_color_npg()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: country